﻿using System;
using System.Windows.Controls.Primitives;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using produccion.clases;
using System.ComponentModel;
using System.IO;
using System.Diagnostics;
using produccion.vistamodelo;
using produccion.reportes;
using System.Threading;
using System.Globalization;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FrmResumenDeVentasPorMes.xaml
    /// </summary>
    public partial class FrmConsultaDeOrdenesDeDespacho : Window
    {
        #region FJRF - VARIABLES GENERIAS DE TODO EL FORMULARIO
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral

        DataTable DtConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        DataTable DtConsultaTmp;//FJRF - Usamos este DataTable para hacer consultas generales temporales
        DataTable DtConsultaPrincipal;//FJRF - Usamos este DataTable para hacer consultas generales

        DataTable DtVisDetOrdD;//FJRF - Usamos este DataTable para hacer consultas generales

        DataSet DsConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        String StrConsulta;//FJRF - Usamos este DataTable para hacer consultas generales

        DataTable DtEncabezadoYParametros;//FJRF - Usamos este DataTable para hacer consultas generales del os encabezados mas los parametros
        DataTable DtImprimir;//FJRF - Usamos este DataTable para imprimir
        DataSet DsImprimir;//FJRF - Usamos este dataset para la impresion de consultas

        string StrMensajeBox = "";//FJRF - Para los mensajes de las cajas de texto
        string StrCaptionBox = "";//FJRF - Para los mensajes de los caption de las cajas de texto

        string StrCodigoPrimerColorReferencia;

        String StrNumeroEntrega;//FJRF - Numero del pedido
        String StrLineaAEjecutarEnCmd;//FJRF - Linea a ejecutar en el Cmd

        //String StrRutaReporteCrystalReport = @"c:\produccion\produccion\reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports
        String StrRutaReporteCrystalReport = @"reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports
        #endregion

        public FrmConsultaDeOrdenesDeDespacho()
        {
            InitializeComponent();
        }
        #region FJRF - OBJETOS DEL FORMULARIO
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //FJRF - CON ESTO GARANTIZAMOS QUE LAS FECHAS SIEMPRE VENDRAN EN ESTE FORMATO DE DIA/MES/AÑO
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");//FJRF - Con esto aseguramos que la base de datos reciba los numeros como se deben recibir
            Thread.CurrentThread.CurrentCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
            Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";

            string strTituloVentana = "CONSULTA DE ORDENES DE DESPACHO" + " - Usuario:" + MDOgeneral.usuario + " - [FrmConsultaDeOrdenesDeDespacho]";//FJRF - Armamos el titulo de la ventana
            Title = strTituloVentana;//FJRF - Ponemos el titulo de la ventana

            DateTime DttFecha = DateTime.Now;
            DtpFechaInicial.SelectedDate = DttFecha;
            DtpFechaFinal.SelectedDate = DttFecha;

            CboCodigoCliente.Style = null;
            CboNombreCliente.Style = null;

            StrConsulta = "SELECT CODCLI_CLI, NOMCLI_CLI FROM maeclip ORDER BY NOMCLI_CLI";//FJRF - Creamos la consulta que cargara los clientes

            CargarCombo(CboCodigoCliente, StrConsulta, "CODCLI_CLI", "CODCLI_CLI", "Codigo");//FJRF - Cargamos el codigo
            CargarCombo(CboNombreCliente, StrConsulta, "CODCLI_CLI", "NOMCLI_CLI", "Nombre");//FJRF - Cargamos el nombre

            CboCodigoCliente.Visibility = Visibility.Visible;//FJRF - Ponemos el objeto visible
            CboNombreCliente.Visibility = Visibility.Visible;//FJRF - Ponemos el objeto visible

            CboCodigoCliente.Text = "TODOS";
            CboNombreCliente.Text = "TODOS";

            CboCodigoCliente.Focus();
        }
        private void BtnImprimir_Click(object sender, RoutedEventArgs e)
        {
            PubV_Imprimir(StrNumeroEntrega);
        }
        public void PubV_Imprimir(String StrNumeroOrden)
        {
            //FJRF - Creamos las variables que necesitamos para el informe
            string StrComandoDado, StrRutaPlano, StrNombreDocumento, StrRutaImpresionLPT2, StrLineaAEjecutar;

            try
            {
                if (MDOgeneral.strImpresionLPT2 == "" || MDOgeneral.strImpresionLPT2 == null)
                {
                    //PrivV_ImprimirInformeEnCrystalReport();
                    MessageBox.Show("El reporte en cystal aun no se ha creado... estamos trabajando en eso", "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Stop);
                }
                else
                {
                    EjecutarSp_SP_IMPORDDESP(StrNumeroOrden);//FJRF - Ejecutamos el sp con el numero de la orden

                    StrComandoDado = "COPY";//FJRF - Enviamos el comando que vamos a ejecutar
                    StrRutaPlano = MDOgeneral.strRutaImpresionDocumentos;//FJRF - Cargamos la ruta del archivo plano donde la deja el sp
                    StrNombreDocumento = "LOR" + StrNumeroOrden + ".LOR";//FJRF - Armamos el nombre del documento
                    StrRutaImpresionLPT2 = MDOgeneral.strImpresionLPT2;//FJRF - Enviamos la ruta de impresion -  esto es como decir (@"\\frar01\epson_javier")

                    StrLineaAEjecutar = StrComandoDado + " " + StrRutaPlano + StrNombreDocumento + " " + StrRutaImpresionLPT2;//FJRF - Armamos la linea de comando a ejecutar

                    EjecutarComando(StrLineaAEjecutar);//FJRF - Ejecutamos el comando dado en la linea
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        private void EjecutarSp_SP_IMPORDDESP(string StrCodigoOrden)//FJRF - Este procedimiento ejecuta un sp
        {
            try
            {
                MDOgeneral.spComando.CommandText = "SP_IMPORDDESP";
                MDOgeneral.spComando.Connection = MDOgeneral.conexion;
                MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                MDOgeneral.spComando.Parameters.Clear();

                //Input
                MDOgeneral.spComando.Parameters.Add("pva_nroord", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = String.IsNullOrEmpty(StrCodigoOrden) ? "   " : StrCodigoOrden;

                //Output salidas
                MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
        }
        private void CboCodigoCliente_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (CboCodigoCliente.Visibility == Visibility.Visible)//FJRF - Si el codigo esta visible hacemos lo siguiente
            {
                CboNombreCliente.SelectedIndex = CboCodigoCliente.SelectedIndex;//FJRF - Igualamos el index del codigo al index del nombre
                DtpFechaInicial.Focus();//FJRF - Ponemos el foco en la fecha inicial
            }
        }
        private void CboNombreCliente_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (CboNombreCliente.Visibility == Visibility.Visible)//FJRF - Si el nombre esta visible hacemos lo siguiente
            {
                CboCodigoCliente.SelectedIndex = CboNombreCliente.SelectedIndex;//FJRF - Igualamos el index del nombre al index del cliente
                DtpFechaInicial.Focus();//FJRF - Ponemos el foco en la fecha inicial
            }
        }
        System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();//FJRF - Creamos un manejador de tiempo
        private void DamosTiempoParaImpresionYEjecutamos(int IntSegundos)
        {
            dispatcherTimer = new System.Windows.Threading.DispatcherTimer();//FJRF - Creamos un nuevo elemento de manejador de tiempo 

            dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);//FJRF - Decimos el evento que lo ejecutara
            dispatcherTimer.Interval = new TimeSpan(0, 0, IntSegundos);//FJRF - Decimos el tiempo de espera
            dispatcherTimer.Start();//FJRF - Inicializamos el proceso
        }
        private void dispatcherTimer_Tick(object sender, EventArgs e)
        {
            EjecutarComando(StrLineaAEjecutarEnCmd);//FJRF - Ejecutamos el comando dado en la linea

            dispatcherTimer.Stop();//FJRF - Detenemos el temporizador para que no se siga ejecutando
            dispatcherTimer = null;//FJRF - Lo volvemos null o no se detendra

            StrCaptionBox = "PROCESO EXITOSO";
            StrMensajeBox = "La impresión se realizo con exito";
            Msgbox(StrCaptionBox, StrMensajeBox, MessageBoxButton.OK, MessageBoxImage.Information);
        }

        private void EjecutarComando(string StrComando)//FJRF - Este procedimiento ejecuta un comando en dos (CMD)
        {
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            proc.StartInfo.FileName = "cmd";
            proc.StartInfo.RedirectStandardInput = true;
            proc.StartInfo.RedirectStandardOutput = true;
            proc.StartInfo.CreateNoWindow = true;
            proc.StartInfo.UseShellExecute = false;
            proc.Start();
            proc.StandardInput.WriteLine(StrComando);
            proc.StandardInput.Flush();
            proc.StandardInput.Close();
            proc.Close();
        }
        private void BtnProcesar_Click(object sender, RoutedEventArgs e)
        {
            #region FJRF - Establecemos los parametros de los clientes q se enviaran a la consulta
            String StrClienteIncial, StrClienteFinal;

            if (CboCodigoCliente.SelectedItem != null)//FJRF - Validamos que el campo no llegue nullo
            {
                String StrDatoInicial = CboCodigoCliente.Text;
                if (StrDatoInicial == "TODOS")
                {
                    StrClienteIncial = "   ";
                    StrClienteFinal = "ZZZ";
                }
                else
                {
                    StrClienteIncial = StrDatoInicial;
                    StrClienteFinal = StrDatoInicial;
                }
            }
            else
            {
                StrClienteIncial = "   ";
                StrClienteFinal = "ZZZ";
            }
            #endregion

            PttV_Procesar(StrClienteIncial, StrClienteFinal);//FJRF - Buscamos la informacion
        }
        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            this.Close();//FJRF - Cierra el modulo actual
        }
        private void DtgDatosArriba_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna == "TOTAL")
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Alineamos la celda a la derecha
            }
            if (e.PropertyType == typeof(System.DateTime))//FJRF - Estas son las columnas que tendran el formato de fecha
            {
                (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MM/yyyy";//FJRF - Asignamos el formato a la fecha
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
        }
        private void DtgDatosArriba_KeyUp(object sender, KeyEventArgs e)
        {
            String StrNumeroOrden;//FJRF - Variables que se necesitan para enviarlos como parametros para buscar la imagen de la referencia

            DataRowView DrwDatosDelGrid = DtgDatosArriba.SelectedItem as DataRowView;//FJRF - Cargamos un DataRowView con el dato seleccionado
            DataRow DrFilaDelGrid = DrwDatosDelGrid.Row;//FJRF - Asignamos las finas

            StrNumeroOrden = Convert.ToString(DrFilaDelGrid.ItemArray[0]);//FJRF - Traemos el dato en la columna dada de la fila seleccionada

            PttV_ProcesarConsultaAbajo(StrNumeroOrden);//FJRF - Consultamos el dato seleccionado jajaja
        }
        private void DtgDatosArriba_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            String StrNumeroOrden;//FJRF - Variables que se necesitan para enviarlos como parametros para buscar la imagen de la referencia

            if (DtgDatosArriba.SelectedItem == null)
            {
                return;
            }
            else
            {
                DataRowView DrwDatosDelGrid = DtgDatosArriba.SelectedItem as DataRowView;//FJRF - Cargamos un DataRowView con el dato seleccionado
                DataRow DrFilaDelGrid = DrwDatosDelGrid.Row;//FJRF - Asignamos las finas

                StrNumeroOrden = Convert.ToString(DrFilaDelGrid.ItemArray[0]);//FJRF - Traemos el dato en la columna dada de la fila seleccionada

                PttV_ProcesarConsultaAbajo(StrNumeroOrden);//FJRF - Consultamos el dato seleccionado jajaja
            }
        }
        private void CboCodigoCliente_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si presiona la tecla enter hacemos lo siguiente
            {
                DtpFechaInicial.Focus();//FJRF - Ponemos el foco en la fecha inicial
            }
        }
        private void CboNombreCliente_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si presiona la tecla enter hacemos lo siguiente
            {
                DtpFechaInicial.Focus();//FJRF - Ponemos el foco en la fecha inicial
            }
        }
        private void DtgDatosAbajo_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna == "TALLA" || strNombreColumna == "CANTIDAD" || strNombreColumna == "PRECIO")
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Alineamos la celda a la derecha
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
        }
        private void DtgDatosAbajo_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            if (DtgDatosAbajo.SelectedItem == null)//FJRF - Si no hay algun pedido seleccionado hacemos lo siguiente
            {
                return;//FJRF - Nos salimos
            }
            else //FJRF - Si tiene datos hacemos lo siguiente
            {
                DataRowView dr = DtgDatosAbajo.SelectedItem as DataRowView;//FJRF - Cargamos un DataRowView con el dato seleccionado
                DataRow dr1 = dr.Row;//FJRF - Asignamos las finas
                String StrCodigoReferencia = Convert.ToString(dr1.ItemArray[0]);//FJRF - Decimos que en la columna 0 nos traiga el dato de la fila seleccionada
                String StrNombreReferencia = Convert.ToString(dr1.ItemArray[1]);//FJRF - Decimos que en la columna 2 nos traiga el dato de la fila seleccionada
                String StrColorReferencia = Convert.ToString(dr1.ItemArray[2]);//FJRF - Decimos que en la columna 1 nos traiga el dato de la fila seleccionada

                PonerImagen(StrCodigoReferencia, StrColorReferencia, StrNombreReferencia);//FJRF - Buscamos la imagen
                txtReferencia.Text = StrCodigoReferencia;
            }
        }
        private void DtgDatosAbajo_KeyUp(object sender, KeyEventArgs e)
        {
            if (DtgDatosAbajo.SelectedItem == null)//FJRF - Si no hay algun pedido seleccionado hacemos lo siguiente
            {
                return;//FJRF - Nos salimos
            }
            else //FJRF - Si tiene datos hacemos lo siguiente
            {
                DataRowView dr = DtgDatosAbajo.SelectedItem as DataRowView;//FJRF - Cargamos un DataRowView con el dato seleccionado
                DataRow dr1 = dr.Row;//FJRF - Asignamos las finas
                String StrCodigoReferencia = Convert.ToString(dr1.ItemArray[1]);//FJRF - Decimos que en la columna 0 nos traiga el dato de la fila seleccionada
                String StrNombreReferencia = Convert.ToString(dr1.ItemArray[2]);//FJRF - Decimos que en la columna 2 nos traiga el dato de la fila seleccionada
                String StrColorReferencia = Convert.ToString(dr1.ItemArray[3]);//FJRF - Decimos que en la columna 1 nos traiga el dato de la fila seleccionada

                PonerImagen(StrCodigoReferencia, StrColorReferencia, StrNombreReferencia);//FJRF - Buscamos la imagen
                txtReferencia.Text = StrCodigoReferencia;
            }
        }

        #endregion

        #region FJRF - PROCEDIMIENTOS Y FUNCIONES PROPIAS DEL FORMULARIO
        protected void PttV_Procesar(String StrCodigoClienteIncial, String StrCodigoClienteFinal)
        {
            Mouse.OverrideCursor = Cursors.Wait;//FJRF - Ponemos el cursor en forma de espera

            StrConsulta = "SELECT NROORD_EOD AS ORDEN, CODCLI_EOD AS CODCLI, NOMCLI_CLI AS CLIENTE, FECORD_EOD AS FECHA, ESTADO_EOD AS ESTADO, NRODES_EOD, TIPORD_EOD AS TIPO, SUM(CANPRO_DOD) AS TOTAL ";
            StrConsulta = StrConsulta + "FROM ENCORDD, MAECLIP, DETORDD ";
            StrConsulta = StrConsulta + "WHERE CODCLI_EOD BETWEEN '" + StrCodigoClienteIncial + "' AND '" + StrCodigoClienteFinal + "' ";
            StrConsulta = StrConsulta + "AND CODCLI_CLI = CODCLI_EOD ";
            StrConsulta = StrConsulta + "AND FECORD_EOD BETWEEN '" + DtpFechaInicial.SelectedDate.Value.ToShortDateString() + "' AND '" + DtpFechaFinal.SelectedDate.Value.ToShortDateString() + "' ";
            StrConsulta = StrConsulta + "AND NROORD_DOD = NROORD_EOD ";
            StrConsulta = StrConsulta + "GROUP BY NROORD_EOD, CODCLI_EOD, NOMCLI_CLI, FECORD_EOD, ESTADO_EOD, NRODES_EOD, TIPORD_EOD ";
            StrConsulta = StrConsulta + "ORDER BY NROORD_EOD DESC ";

            DtConsultaPrincipal = MdoGeneral.consulta(StrConsulta);
            DtgDatosArriba.ItemsSource = DtConsultaPrincipal.DefaultView;

            StrConsulta = "SELECT * FROM vis_detordd ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "WHERE FECHAORDEN BETWEEN '" + DtpFechaInicial.SelectedDate.Value.ToShortDateString() + "' AND '" + DtpFechaFinal.SelectedDate.Value.ToShortDateString() + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND CODIGOCLIENTE BETWEEN '" + StrCodigoClienteIncial + "' AND '" + StrCodigoClienteFinal + "' ";//FJRF - Armamos la consulta
            DtVisDetOrdD = MdoGeneral.consulta(StrConsulta);

            Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Ponemos el foco de forma normal
        }
        protected void PttV_ProcesarConsultaAbajo(String StrNumeroOrden)
        {
            Mouse.OverrideCursor = Cursors.Wait;//FJRF - Ponemos el cursor en forma de espera

            StrConsulta = "SELECT CODREF_DOD AS CODREF, NOMREF_REF AS REFERENCIA,  CODCOL_DOD AS CODCOL, NOMCOL_COL AS COLOR,  CODTAL_DOD AS TALLA,  CANPRO_DOD AS CANTIDAD,  PREPRO_DOD AS PRECIO ";
            StrConsulta = StrConsulta + "FROM DETORDD, USU_DBA.MAEREF , USU_DBA.MAECOL ";
            StrConsulta = StrConsulta + "WHERE NROORD_DOD = '" + StrNumeroOrden + "' ";
            StrConsulta = StrConsulta + "AND CODREF_REF = CODREF_DOD  ";
            StrConsulta = StrConsulta + "AND CODCOL_COL = CODCOL_DOD ";

            DtConsulta = MdoGeneral.consulta(StrConsulta);
            DtgDatosAbajo.ItemsSource = DtConsulta.DefaultView;

            if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos hacemos lo siguiente
            {
                StrNumeroEntrega = StrNumeroOrden;//FJRF - cargamos la variable
            }
            else//FJRF - Si no hay datos entonces
            {
                StrNumeroEntrega = "";//FJRF - limpiamos la variable
            }

            Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Ponemos el foco de forma normal
        }

        protected void PttV_Imprimir()
        {
            try//FJRF - Validamos el proceso de impresion 
            {
                VMMontajeaDespachos vmMontajeDespachos = new VMMontajeaDespachos();
                vmMontajeDespachos.imprimir("");

            }
            catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
            {
                Msgbox("PROCESO CANCELADO - [Error del sistema]", ex.Message.ToString(), MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
            }
        }

        #region FJRF - CajaDeTextoMsgbox
        protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
        {
            MessageBoxButton buttons;
            buttons = MsbTipoBoton;

            MessageBoxImage icon = MsbTipoImagenIcono;
            MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
        }
        #endregion

        #region FJRF - ParaObtenerLasPropiedadesDeLaCeldaDelGrid
        //DataGridCell cell = DataGridHelper.GetCell(dgEst, dgEst.SelectedIndex, 0);//FJRF - Asi se llama
        static class DataGridHelper
        {
            static public DataGridCell GetCell(DataGrid dg, int row, int column)
            {
                DataGridRow rowContainer = GetRow(dg, row);

                if (rowContainer != null)
                {
                    DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

                    // try to get the cell but it may possibly be virtualized
                    DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    if (cell == null)
                    {
                        // now try to bring into view and retreive the cell
                        dg.ScrollIntoView(rowContainer, dg.Columns[column]);
                        cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    }
                    return cell;
                }
                return null;
            }

            static public DataGridRow GetRow(DataGrid dg, int index)
            {
                DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                if (row == null)
                {
                    // may be virtualized, bring into view and try again
                    dg.ScrollIntoView(dg.Items[index]);
                    row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                }
                return row;
            }

            static T GetVisualChild<T>(Visual parent) where T : Visual
            {
                T child = default(T);
                int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
                for (int i = 0; i < numVisuals; i++)
                {
                    Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
                    child = v as T;
                    if (child == null)
                    {
                        child = GetVisualChild<T>(v);
                    }
                    if (child != null)
                    {
                        break;
                    }
                }
                return child;
            }
        }
        #endregion

        #region FJRF - ParaAlinearALaDerecha
        public static Style newCellStyleAlinearDerecha()
        {
            System.Windows.Style style = new Style(typeof(DataGridCell));
            style.Setters.Add(new System.Windows.Setter
            {
                Property = Control.HorizontalAlignmentProperty,
                Value = HorizontalAlignment.Right
            });
            return style;
        }
        #endregion

        #region FJRF - CargarCombosDejandoUnEspacioEnBlanco
        private Boolean CargarCombo(ComboBox CboComboACargar, string strConsultaOracle, string strSelectedValuePath, string strDisplayMemberPath, string strCodigoNombre)
        {
            Boolean BooSiHayDatos = false;//FJRF - Variable para informar si hay datos o no
            CboComboACargar.ItemsSource = null;
            CboComboACargar.Items.Clear();//FJRF - Borramos los posibles datos que pueda tener el combo

            DtConsulta = new DataTable();//FJRF - Inicializamos la variable
            DsConsulta = new DataSet();//FJRF - Inicializamos la variable

            DtConsulta = MdoGeneral.consulta(strConsultaOracle);//FJRF - Realizamos la consulta y retornamos los datos

            if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos llenar el combo
            {
                BooSiHayDatos = true;//FJRF - Informamos que hay datos

                DataRow drEncabezado;
                drEncabezado = DtConsulta.NewRow();

                if (strCodigoNombre == "Codigo")
                {
                    drEncabezado[strSelectedValuePath] = "ZZZ999";
                    drEncabezado[strDisplayMemberPath] = "TODOS";
                }
                if (strCodigoNombre == "Nombre")
                {
                    drEncabezado[strSelectedValuePath] = "ZZZ999";
                    drEncabezado[strDisplayMemberPath] = "TODOS";
                }

                DtConsulta.Rows.Add(drEncabezado);

                DsConsulta.Tables.Add(DtConsulta);//FJRF - Adicionameos el datatable al dataset
                CboComboACargar.ItemsSource = DsConsulta.Tables[0].DefaultView;//FJRF - Cargamos los datos encontrados
                CboComboACargar.SelectedValuePath = strSelectedValuePath.ToUpper();//FJRF - Cargamos la posicion
                CboComboACargar.DisplayMemberPath = strDisplayMemberPath.ToUpper();//FJRF - Decimos cual dato se mostrara

                CboComboACargar.SelectedValuePath = "ZZZ999";//FJRF - Ponemos el combo en la primera posicion
            }
            return BooSiHayDatos;//FJRF - Avisamos que si hay o no hay datos
        }
        #endregion

        #region FJRF - PonerFoto

        private void PonerImagen(string strCodigoReferencia, string strCodigoColor, string strNombreReferencia)
        {
            if (String.IsNullOrEmpty(strCodigoColor))
            {
                BitmapImage b = new BitmapImage();
                if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + ".jpg"))
                {
                    b.BeginInit();
                    b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + ".jpg");
                    b.EndInit();
                    imgFoto.Stretch = Stretch.Fill;
                    imgFoto.Source = b;
                    ImagenTooltip.Source = b;
                    txbNombreImagen.Text = strNombreReferencia;
                }
                else
                {
                    imgFoto.Source = null;
                }
            }
            else
            {
                BitmapImage b = new BitmapImage();
                if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + strCodigoColor + ".jpg"))
                {
                    b.BeginInit();
                    b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + strCodigoColor + ".jpg");
                    b.EndInit();
                    imgFoto.Stretch = Stretch.Fill;
                    imgFoto.Source = b;
                    ImagenTooltip.Source = b;
                    txbNombreImagen.Text = strNombreReferencia;
                }
                else
                {
                    if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + StrCodigoPrimerColorReferencia + ".jpg"))
                    {
                        b.BeginInit();
                        b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + StrCodigoPrimerColorReferencia + ".jpg");
                        b.EndInit();
                        imgFoto.Stretch = Stretch.Fill;
                        imgFoto.Source = b;
                        ImagenTooltip.Source = b;
                        txbNombreImagen.Text = strNombreReferencia;
                    }
                    else
                    {
                        Boolean BooExiste = false;
                        //Foto para cualquier color-Consultar colores para referencia
                        clases.CLSMAEPRO mae = new clases.CLSMAEPRO { CODREF_PRO = strCodigoReferencia };
                        DataTable val = mae.BuscarColor();

                        foreach (DataRow r in val.Rows)
                        {
                            if (!String.IsNullOrEmpty(r["Codigo"].ToString()))
                            {
                                string StrRuta = MDOgeneral.Fotos_BOSI + strCodigoReferencia + r["Codigo"].ToString() + ".jpg";
                                if (File.Exists(StrRuta))
                                {
                                    BitmapImage BitFoto = new BitmapImage();
                                    BitFoto.BeginInit();
                                    BitFoto.UriSource = new Uri(StrRuta);
                                    BitFoto.EndInit();
                                    imgFoto.Source = BitFoto;
                                    ImagenTooltip.Source = BitFoto;
                                    txbNombreImagen.Text = strNombreReferencia;

                                    BooExiste = true;

                                    break;//FJRF - Si la encontro nos salimos
                                }
                            }
                        }

                        if (BooExiste == false)
                        {
                            imgFoto.Source = null;
                        }
                    }
                }
            }
        }

        #endregion

        private void imgFoto_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            try
            {
                //Para llamar el PDF de la ficha tecnica de la referencia
                if (File.Exists(MDOgeneral.Fotos_BOSI + txtReferencia.Text.Trim() + ".PDF"))
                {
                    //MessageBox.Show("Si existe la ficha tecnica", "Confirmación", MessageBoxButton.OK, MessageBoxImage.Hand, MessageBoxResult.OK);
                    String fileName = MDOgeneral.Fotos_BOSI + txtReferencia.Text.Trim() + ".PDF";
                    System.Diagnostics.Process process = new System.Diagnostics.Process();
                    process.StartInfo.FileName = fileName;
                    process.Start();
                }
                else
                {
                    MessageBox.Show("No existe la ficha tecnica", "Confirmación", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        #endregion

        private void BtnExportarExcel_Click(object sender, RoutedEventArgs e)
        {
            if (DtVisDetOrdD != null)//FJRF - Si no esta nulo hacemos lo siguiente
            {
                if (DtVisDetOrdD.Rows.Count > 0)//FJRF - Si tiene datos hacemos lo siguiente
                {
                    FrmAyudasGenericas FrmAyudas = new FrmAyudasGenericas();//FJRF - Creamos una variable que maneje las propiedades del formulario que vamos a invocar
                    FrmAyudas.pStrTituloVentana_Opcional = "CONSULTA DE ORDENES DE DESPACHO";//FJRF - Le enviamos un titulo personalizado al formulario

                    FrmAyudas.pDtDatosRecibidosConInformacion = DtVisDetOrdD.Copy();
                    FrmAyudas.pStrCampoCodigoDeLaTabla_Obligatorio = "NROORDEN";//FJRF - Le decimos que este es el campo codigo o llave debe tener el nombre final osea el alias si es q lo tiene
                    FrmAyudas.pStrBuscarPorDefectoEnElCampo_Opcional = "NOMBREREFERENCIA";//FJRF - Asignamos el dato a buscar
                    FrmAyudas.pBooQuitarBotonRetornar_Opcional = true;//FJRF - Quitamos el boton de retornar datos
                    FrmAyudas.pBooPonerBotonExportarExcel_Opcional = true;//FJRF - Activamos el boton para que se le permita la exportacion de datos a excel

                    String StrColumnasParaFormato = "CANTIDAD, TALLA, CANTIDAD, PRECIO ";//FJRF - Columnas para formato numerico
                    FrmAyudas.pStrNombreColumnasParaFormatoNumericoSeparadoPorComas_Opcional = StrColumnasParaFormato;//FJRF - Enviamos las columnas que se le van a hacer formato numerico

                    FrmAyudas.ShowDialog();//FJRF - Invocamos el formulario
                }
                else//FJRF - Si no tiene datos hacemos lo siguiente
                {
                    MessageBox.Show("No hay datos para exportar a Excel", "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Enviamos un mensaje al usuario
                }
            }
            else//FJRF - Si esta nulo hacemos lo siguiente
            {
                MessageBox.Show("No hay datos para exportar a Excel", "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Enviamos un mensaje al usuario
            }
        }
    }
}

